package com.wxmit.ot.gen.domain;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.wxmit.ot.enums.YesOrNoEnum;
import com.wxmit.ot.gen.annotate.CodeTemplateParamAnn;
import com.wxmit.ot.gen.constant.QueryTypeConstant;
import com.wxmit.ot.gen.domain.dto.GenTableInitDto;
import com.wxmit.ot.gen.enums.Db2JavaFieldEnum;
import lombok.Data;
import lombok.experimental.Accessors;
import lombok.experimental.FieldNameConstants;

import java.util.Date;
import java.util.Locale;
import java.util.Map;

/**
 * 生成代码 表格列信息
 *  此对象信息将映射为默认变量
 *
 * @author huangxiong
 * @version V1.0
 * @date 2023/2/22 17:12
 */
@Data
@Accessors(chain = true)
@TableName("ot_gen_table_column")
public class GenTableColumn {

    @TableId(type = IdType.AUTO)
    @FieldNameConstants.Exclude
    private Long id;

    /**
     *  列名
     */
    @CodeTemplateParamAnn("列名")
    private String name;

    /**
     * java字段名
     */
    @CodeTemplateParamAnn("字段名")
    private String fieldName;

    /**
     *  原始类型（数据库中的属性）
     */
    @CodeTemplateParamAnn("原始类型（数据库中的属性）")
    private String sourceType;

    /**
     * java类型
     */
    @CodeTemplateParamAnn("java类型")
    private String javaType;



    /**
     * html类型
     */
    @CodeTemplateParamAnn("前端表单类型")
    private String formType;

    /**
     * 查询类型（LIKE，EQ...）
     */
    @CodeTemplateParamAnn("后台查询类型（LINE，EQ...）")
    private String queryType;

    /**
     * 是否必填
     */
    @CodeTemplateParamAnn("是否必填")
    private String isRequired;

    /**
     * 是否插入
     */
    @CodeTemplateParamAnn("是否插入")
    private String isInsert;

    /**
     * 是否编辑
     */
    @CodeTemplateParamAnn("是否编辑")
    private String isEdit;

    /**
     * 是否查询
     */
    @CodeTemplateParamAnn("是否查询")
    private String isQuery;

    /**
     * 是否列表展示
     */
    @CodeTemplateParamAnn("是否列表展示")
    private String isList;

    /**
     *  排序（从大到小）
     */
    private Integer sort;

    /**
     *  是否主键
     */
    @CodeTemplateParamAnn("是否主键")
    private String isPk;

    /**
     * 列注释
     */
    @CodeTemplateParamAnn("列注释")
    private String comment;

    /**
     * 扩展变量
     */
    @TableField(typeHandler = JacksonTypeHandler.class )
    @CodeTemplateParamAnn("扩展变量")
    private Map<String,String> extra;

    @CodeTemplateParamAnn("数据库列默认值")
    private String defVal;

    private Long tableId;

    /** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd",timezone="GMT+8")
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;


    /**
     *  根据initDto 构建 表格列对象
     * @param initDto initDto
     * @param dbType 数据库类型
     * @return 数据库列对象
     */
    public static GenTableColumn  buildGenTableColumnByInitDto(GenTableInitDto.GenTableColumnInitDto initDto,String dbType) {
        GenTableColumn genTableColumn = new GenTableColumn();

        // initDto 映射
        genTableColumn.setName(initDto.getName());
        genTableColumn.setSourceType(initDto.getType());
        genTableColumn.setIsRequired(initDto.getIsRequired());
        genTableColumn.setDefVal(initDto.getDefVal());
        genTableColumn.setIsPk(initDto.getIsPk());
        genTableColumn.setComment(initDto.getComment());

        // 系统设置
        genTableColumn.setSort(genTableColumn.getIsPkBoolean() ? 1 :0);
        genTableColumn.setFieldName(columnName2fieldName(genTableColumn.getName()));

        // isInsert isEdit isQuery isList
        genTableColumn.setIsInsert(YesOrNoEnum.YSE.code);
        genTableColumn.setIsEdit(YesOrNoEnum.YSE.code);
        genTableColumn.setIsList(YesOrNoEnum.YSE.code);
        genTableColumn.setIsQuery(YesOrNoEnum.YSE.code);

        // queryType htmlType
        genTableColumn.setQueryType(QueryTypeConstant.EQ);
        genTableColumn.setFormType("input");
        //javaType
        genTableColumn.setJavaType(Db2JavaFieldEnum.getByDbFieldType(dbType,genTableColumn.getSourceType()).javaFieldType);

        return genTableColumn;
    }

    /**
     *  列名 2 字段名
     *  1. 转小写 （ USER_NAME 2 user_name ）
     *  2. 下划线转驼峰 （ user_name 2 userName ）
     * @param columnName 列名
     * @return 字段名
     */
    public static String columnName2fieldName(String columnName){
        return StrUtil.toCamelCase(columnName.toLowerCase(Locale.ROOT));
    }

    public Boolean getIsPkBoolean(){
        return YesOrNoEnum.getBooleanByCode(this.getIsPk());
    }
}
